import { defineStore } from 'pinia';
import api from '../utils/request';

// 定义用户信息接口
interface UserInfo {
  userId?: number;
  username?: string;
  avatar?: string;
  email?: string;
  roles?: string[];
  permissions?: string[];
}

// 定义用户状态接口
interface UserState {
  token: string;
  userInfo: UserInfo;
  loading: boolean;
}

// 创建用户状态存储
export const useUserStore = defineStore('user', {
  // 状态
  state: (): UserState => ({
    // 从本地存储获取token
    token: localStorage.getItem('token') || '',
    // 用户信息
    userInfo: {},
    // 加载状态
    loading: false
  }),
  
  // getter
  getters: {
    // 判断用户是否已登录
    isLoggedIn: (state) => !!state.token,
    // 获取用户角色
    roles: (state) => state.userInfo.roles || [],
    // 判断是否是管理员
    isAdmin: (state) => {
      const roles = state.userInfo.roles || [];
      return roles.includes('admin');
    }
  },
  
  // actions
  actions: {
    /**
     * 设置token
     * @param token 用户token
     */
    setToken(token: string) {
      this.token = token;
      // 保存到本地存储
      localStorage.setItem('token', token);
    },
    
    /**
     * 清除token
     */
    clearToken() {
      this.token = '';
      // 从本地存储删除
      localStorage.removeItem('token');
    },
    
    /**
     * 设置用户信息
     * @param userInfo 用户信息
     */
    setUserInfo(userInfo: UserInfo) {
      this.userInfo = userInfo;
    },
    
    /**
     * 登录操作
     * @param loginData 登录数据
     */
    async login(loginData: { username: string; password: string }) {
      this.loading = true;
      try {
        // 调用登录接口
        const res = await api.user.login({
          usernameOrEmail: loginData.username,
          password: loginData.password,
          rememberMe: false
        });
        // 保存token
        this.setToken(res.data.token);
        // 获取用户信息
        await this.getUserInfo();
        return res;
      } finally {
        this.loading = false;
      }
    },
    
    /**
     * 登出操作
     */
    async logout() {
      if (this.token) {
        try {
          // 调用登出接口
          await api.user.logout();
        } catch (error) {
          console.error('登出失败', error);
        }
      }
      // 清除token和用户信息
      this.clearToken();
      this.userInfo = {};
    },
    
    /**
     * 获取用户信息
     */
    async getUserInfo() {
      try {
        this.loading = true;
        // 调用获取用户信息接口
        const res = await api.user.getInfo();
        this.setUserInfo(res.data);
        return res;
      } finally {
        this.loading = false;
      }
    },
    
    /**
     * 检查权限
     * @param permission 要检查的权限
     */
    hasPermission(permission: string) {
      const permissions = this.userInfo.permissions || [];
      return permissions.includes(permission);
    }
  }
});